package main

import (
	"fmt"
	"math/rand"
	"time"
)

func SliceDemo() {
	s1 := make([]int, 3, 4)
	s2 := append(s1, 1)
	// s1内有[0 0 0]
	fmt.Println(s1)
	// s2内有[0 0 0 1]
	fmt.Println(s2)

	// s1修改一个元素会影响s2
	s1[0] = 100
	fmt.Println("s1 =", s1)
	fmt.Println("s2 =", s2)
	fmt.Println("-------------------------------")
	// s2修改一个元素会影响s1
	s2[1] = 99
	fmt.Println("s1 =", s1)
	fmt.Println("s2 =", s2)
	// s2再增加一个元素，s2切片的长度和容量都会改变
	fmt.Println("-------------------------------")
	s2 = append(s2, 3)
	fmt.Printf("%d %d %v\n", len(s1), cap(s1), s1)
	fmt.Printf("%d %d %v\n", len(s2), cap(s2), s2)
}

func SliceNum() {
	// 2、有一个数组 [1,4,9,16,2,5,10,15]，
	// 生成一个新切片，要求新切片元素是数组相邻2项的和。
	num := [8]int{1, 4, 9, 16, 2, 5, 10, 15} // 定义数组
	slice := make([]int, 0)                  // 定义切片
	sum01 := num[0] + num[1]
	sum02 := num[1] + num[2]
	sum03 := num[2] + num[3]
	sum04 := num[3] + num[4]
	sum05 := num[4] + num[5]
	sum06 := num[5] + num[6]
	sum07 := num[6] + num[7]
	slice = append(slice, sum01, sum02, sum03, sum04, sum05, sum06, sum07)
	fmt.Println(slice)
}

func GetNumCount() {
	// 随机数
	rd := rand.New(rand.NewSource(time.Now().UnixNano()))
	sliceNum := make([]int, 100) // 定义切片
	for i := 0; i < 100; i++ {
		randNum := rd.Intn(201) - 100
		sliceNum[i] = randNum // 将生成的随机数添加到切片中
	}
	// 使用冒泡排序算法，将获取到的随机数排序：降序
	for i := 0; i < len(sliceNum); i++ {
		for j := 0; j < len(sliceNum)-i-1; j++ {
			if sliceNum[j] < sliceNum[j+1] {
				sliceNum[j], sliceNum[j+1] = sliceNum[j+1], sliceNum[j]
			}
		}
	}
	// 打印结果，检验是否降序成功
	fmt.Println("sliceNum =", sliceNum)
	fmt.Println(len(sliceNum))
	// 定义字典，键和值都是int类型
	mapNum := make(map[int]int)
	// 遍历切片，用字典进行计算重复出现的数字次数
	for i := 0; i < len(sliceNum); i++ {
		mapNum[sliceNum[i]] += 1
	}

	// 遍历字典查看结果
	for k, v := range mapNum {
		fmt.Printf("%d:%d\n", k, v)
	}
}

func main() {
	SliceDemo()
	fmt.Println("---------------------------------")
	SliceNum()
	fmt.Println("---------------------------------")
	GetNumCount()
}
